# -*- coding:utf-8 -*-
# title           :
# description     :
# author          :Python超人/三月三提供
# date            :2024-06-01
# link            :https://gitcode.net/pythoncr/
# python_version  :3.9
# ==============================================================================
import math

from 神笔码靓.神笔库.神笔绘图板 import 神笔绘图板
from 神笔码靓.神笔库.定义集 import *
from 神笔码靓.神笔库.配置 import *
from 神笔码靓.神笔库.通用工具集 import *


class 高清电子书制作(神笔绘图板):
    页面缩放调整 = 1.0759772  # 1.0759772 < 精确值 < 1.0759773

    def __init__(self, 文本电子书, 作品文件路径=None, 页数=10,
                 横向=否, 电子书字体大小=20, 电子书字体=系统字体.楷体, 文字颜色=颜色.黑色,
                 背景色=颜色.白色, 背景边框色=颜色.透明):
        if 横向:
            宽, 高 = 纸张大小.A4_横向(1)
        else:
            宽, 高 = 纸张大小.A4_纵向(1)

        if 作品文件路径 is None:
            文件名 = 获取文件名(文本电子书)
            作品文件路径 = 文件名[:-4] + ".svg"
            作品文件路径 = 连接路径(作品输出目录(), 作品文件路径)

        self.背景边框色 = 背景边框色
        self.文字颜色 = 文字颜色
        self.背景色 = 背景色
        self.页数 = 页数
        self.页高 = 高
        self.最大页数 = self.页数
        self.文本电子书路径 = 文本电子书
        self.电子书字体大小 = 电子书字体大小
        self.电子书字体 = 电子书字体
        self.当前部 = ""
        self.当前章 = ""
        self.左边距, self.右边距 = 50, 60
        self.上边距, self.下边距 = 100, 80
        self.行间距 = self.电子书字体大小 * 1.65
        self.索引页 = {}
        self.空白页数 = 2

        super(高清电子书制作, self).__init__(作品文件路径=作品文件路径, 宽=宽, 高=高 * 页数)

        self.样式.设置背景色(self.背景色)

    def 页面设置(self, 设置: 纸张设置):
        # 输出 PDF 文件，以及 页面打印，在这里设置好
        设置.上页边距 = 0
        设置.下页边距 = 0
        设置.左页边距 = 0
        设置.右页边距 = 0
        设置.页面方向 = 纸张方向.纵向
        设置.页面尺寸规格 = "A4"
        设置.页面缩放 = self.页面缩放调整

    def 页起始高(self, 页数):
        return (页数 - 1) * self.页高

    # def 显示页参考线(self):
    #     边距 = 20
    #     for i in range(self.页数):
    #         h = self.页起始高(i + 1)
    #         self.画矩形(x=边距, y=边距 + h, 宽=self.宽 - 边距 * 2, 高=self.页高 - 边距 * 2,
    #                  描边颜色=颜色.灰色, 描边宽度=0.5, 描边样式="3,3")

    def 页背景样式(self, 页数):

        页参考线ID = f"页背景样式{页数}"
        if hasattr(self, 页参考线ID):
            return

        # print(f"第{页数}页：", end="\r")
        setattr(self, 页参考线ID, True)
        # 边距 = 20

        # # 背景色
        # if self.背景色 != 颜色.白色:
        #     self.画矩形(x=0, y=h, 宽=self.宽, 高=self.页高, 填充颜色=self.背景色, 描边宽度=0)

        # 背景边框
        # if self.背景边框色 != 颜色.透明:
        #     self.画矩形(x=边距, y=边距 + h, 宽=self.宽 - 边距 * 2, 高=self.页高 - 边距 * 2,
        #              描边颜色=self.背景边框色, 描边宽度=1, 圆角半径=20)
        # 页码
        # 页数 = 页数 - 2
        # if 页数 > 0:
        #     h = self.页起始高(页数)
        #     y = h + self.页高 - self.下边距 + 40
        #     self.写字(x=self.宽 / 2, y=y, 文字=f"{页数}",
        #             填充颜色=self.文字颜色, 字体=系统字体.VERDANA)

    def 写页脚(self, 当前页):
        页脚ID = f"页脚{当前页}"
        if hasattr(self, 页脚ID):
            return
        setattr(self, 页脚ID, True)
        页码 = 当前页 - self.空白页数
        if 页码 > 0:
            h = self.页起始高(当前页)
            y = h + self.页高 - self.下边距 + 15
            self.写字(x=self.宽 / 2, y=y + 25, 文字=f"{页码}",
                    填充颜色=self.文字颜色, 字体=系统字体.Verdana)
            self.连直线([(self.左边距, y), (self.宽 - self.左边距, y)], 描边颜色=self.背景边框色)

    def 写页眉(self, 当前页):
        页眉ID = f"页眉{当前页}"
        if hasattr(self, 页眉ID):
            return
        setattr(self, 页眉ID, True)
        text = self.当前部 + self.当前章
        h = self.页起始高(当前页)
        self.写字(x=self.宽 - 50, y=h + 50, 文字=text, 水平基线对齐=文字水平基线对齐.结束点对齐,
                字体=self.电子书字体, 字体大小=self.电子书字体大小, 填充颜色=self.文字颜色)

        self.连直线([(self.左边距, h + 75), (self.宽 - self.左边距, h + 75)], 描边颜色=self.背景边框色)

    def 写标题页(self, 当前页, 大标题, 作者, f):
        小标题 = ""
        read_line_times = 0
        while 小标题 == "":
            小标题 = f.readline().strip()
            read_line_times += 1
            if 小标题 == 作者:
                小标题 = ""

        self.页背景样式(当前页)

        if 大标题 not in self.索引页:
            self.索引页[大标题] = {}

        if 小标题 not in self.索引页[大标题]:
            self.索引页[大标题][小标题] = 当前页 - self.空白页数

        h = self.页起始高(当前页)

        self.写字(x=self.宽 / 2, y=h + self.页高 / 2 - 100, 文字=作者,
                水平基线对齐=文字水平基线对齐.中点对齐,
                字体=self.电子书字体, 字体大小=self.电子书字体大小 * 2, 填充颜色=self.文字颜色)

        self.写字(x=self.宽 / 2, y=h + self.页高 / 2, 文字=大标题.strip("《》"),
                水平基线对齐=文字水平基线对齐.中点对齐,
                # 字体="汉仪大隶书繁",
                字体=self.电子书字体,
                字体大小=self.电子书字体大小 * 3, 填充颜色=self.文字颜色)

        if "." in 小标题:
            小标题 = "第" + 小标题.replace(".", "章 ")

        self.当前部 = 大标题
        self.当前章 = 小标题

        self.写字(x=self.宽 / 2, y=h + self.页高 / 2 + 100, 文字=小标题,
                水平基线对齐=文字水平基线对齐.中点对齐,
                字体=self.电子书字体, 字体大小=self.电子书字体大小 * 1.5, 填充颜色=self.文字颜色)

        return read_line_times

    def 创作(self):
        from tqdm import tqdm

        当前页 = 1
        当前页行数 = 0
        每页的最大行数 = int(self.页高 - self.上边距 - self.下边距) // self.行间距
        with open(self.文本电子书路径, mode="r", encoding="UTF-8") as f:
            line_count = sum(1 for line in f)

        progress_bar = tqdm(total=line_count, position=0, leave=True)
        with open(self.文本电子书路径, mode="r", encoding="UTF-8") as f:
            line = None

            # for i in range(0, line_count):
            while line != "":
                # print(progress_bar.total, progress_bar.n)
                # while line != "":
                self.页背景样式(当前页)
                line = f.readline()
                if line == "":
                    break
                line_content = line.replace("作者：刘慈欣", "").strip()

                if "【完】" == line_content:
                    progress_bar.update(progress_bar.total - progress_bar.n)  # 假设total是一个很大的数或者设置为已知的最大可能值
                    break
                if "" == line_content:
                    progress_bar.update(1)
                    continue
                elif line_content in ["《三体》", "《三体II：黑暗森林》", "《三体III：死神永生》"]:
                    当前页行数 = 0
                    当前页 = 当前页 + 1
                    self.页背景样式(当前页)
                    read_line_times = self.写标题页(当前页, line_content, "作者：刘慈欣", f)
                    progress_bar.update(read_line_times)
                    当前页 = 当前页 + 1
                    self.页背景样式(当前页)
                    self.写页眉(当前页)
                    self.写页脚(当前页)
                    progress_bar.update(1)
                    continue
                文字列表 = self.转换行文字(文字内容=line, 最大宽度=self.宽 - self.左边距 - self.右边距)
                for text in 文字列表:
                    # if "更沉重一些吧！红卫兵们让他负担的东西确实很重，但不" in text:
                    #     print(text)
                    h = self.页起始高(当前页)
                    self.写字(x=self.左边距, y=h + self.上边距 + 当前页行数 * self.行间距, 文字=text,
                            水平基线对齐=文字水平基线对齐.起始点对齐,
                            字体=self.电子书字体, 字体大小=self.电子书字体大小, 填充颜色=self.文字颜色)
                    当前页行数 = 当前页行数 + 1
                    if 当前页行数 > 每页的最大行数:
                        当前页行数 = 0
                        当前页 = 当前页 + 1
                        self.页背景样式(当前页)
                        self.写页眉(当前页)
                        self.写页脚(当前页)

                progress_bar.update(1)

            # print("OK")
        progress_bar.close()  # 关闭进度条
        self.最大页数 = 当前页
        return

    def 写索引(self):

        for key1 in self.索引页:
            print(key1)
            for key2 in self.索引页[key1]:
                name, page = key2, self.索引页[key1][key2]
                w, h = 获取文字的宽高(self.电子书字体, self.电子书字体大小, f"{name}{page}")
                w = int(math.floor(w / self.电子书字体大小 / 0.895))
                print(name, "." * (35 - w), page, str(35 - w))
        a = """
    《三体》
正文 ........................... 0 27
1.疯狂年代 ...................... 2 22
2.寂静的春天 .................... 10 20
3.红岸之一 ...................... 21 22
4.三十八年后 .................... 27 20
5.台球 ......................... 38 25
6.射手和农场主 ................... 43 19
7.周文王·长夜 .................... 57 20
8.叶文洁 ....................... 68 23
9.字宙闪烁 ...................... 73 22
10.大史 ........................ 81 24
11.三体·墨子·烈焰 ................. 87 17
12.红岸之二 ..................... 96 21
13.红岸之三 .................... 103 20
14.红岸之四 .................... 109 20
15.三体、哥白尼、宇宙橄榄球、三日凌空  113 0
16.三体问题 .................... 119 20
17.三体、牛顿、冯·诺依曼、秦始皇、三日连珠  131 -3
18.聚会 ....................... 143 23
19.三体、爱因斯坦、单摆、大撕裂 ..... 148 5
20.三体、远征 .................. 156 18
21.地球叛军 .................... 159 20
22.红岸之五 .................... 165 20
23.红岸之六 .................... 173 20
24.叛乱 ....................... 178 23
25.雷志成、杨卫宁之死 ............ 183 12
26.无人忏悔 .................... 187 20
27.伊文斯 ..................... 196 21
28.第二红岸基地 ................. 203 17
29.地球三体运动 ................. 206 17
30.两个质子 .................... 210 20
31.古筝行动 .................... 216 20
32.监听员 ..................... 227 21
33.智子 ....................... 235 23
34.虫子 ....................... 253 23
35.尾声·遗址 ................... 258 19
后记 ......................... 261 25
《三体II：黑暗森林》
前言 ......................... 264 25  
上部 面壁者 .................... 274 20  TODO: 1. 
第2节 ........................ 283 24
第3节 ........................ 292 24
第4节 ........................ 301 24
第5节 ........................ 309 24
第6节 ........................ 317 24
第7节 ........................ 325 24
第8节 ........................ 334 24
第9节 ........................ 342 24
第10节 ....................... 351 23
第11节 ....................... 360 23
第12节 ....................... 368 23
第13节 ....................... 378 23
第14节 ....................... 387 23
第15节 ....................... 397 23
第16节 ....................... 406 23
中部 咒语 ..................... 414 21
下部 黑暗森林 ................... 515 19
第17节 ....................... 654 23
第18节 ....................... 663 23
第19节 ....................... 673 23
第20节 ....................... 681 23
第21节 ....................... 688 23
书评 ......................... 695 25
人类应该向刘慈欣致敬 ............. 698 13
《三体III：死神永生》
前言 ......................... 702 25
心事浩渺连广宇 ................. 704 17
序 .......................... 707 26
纪年对照表 .................... 710 20
第一部 ....................... 712 23
第一章 ....................... 714 23
第二章 ....................... 725 23
第三章 ....................... 730 23
第四章 ....................... 738 23
第五章 ....................... 750 23
第六章 ....................... 760 23
第七章 ....................... 766 23
第八章 ....................... 774 23
第二部 ....................... 783 23
第九章 ....................... 841 23
第十章 ....................... 846 23
第十一章 ...................... 852 22
第十二章 ...................... 857 22
第十三章 ...................... 876 22
第十四章 ...................... 889 22
第十五章 ...................... 892 22
第三部 ....................... 909 23
第四部 ....................... 1031 23
第五部 ....................... 1065 23
第六部 ....................... 1126 23
    """

    def 完成前执行(self):
        # print("最大页数", self.最大页数)
        高 = self.页高 * self.最大页数
        self.修改绘图板大小(高=高)
        self.写索引()

    def 转换行文字(self, 文字内容, 最大宽度):
        最大宽度 = 最大宽度 * 1.35
        if 文字内容.strip() == "":
            return []
        文字列表 = []
        指针开始, 指针结束 = 0, 0
        跳跃步长 = 1  # 设定跳跃的步长
        文字内容长度 = len(文字内容)

        while 指针开始 < 文字内容长度:

            if 指针结束 <= 指针开始:
                指针结束 += 跳跃步长

            if len(文字内容) > 指针结束:
                if 文字内容[指针结束] in "。，，：！”\"'.:!?？：;、》":
                    指针结束 = 指针结束 + 1
                    if 文字内容[指针结束] in "”":
                        指针结束 = 指针结束 + 1

            截取内容 = 文字内容[指针开始:指针结束]

            if 截取内容.endswith("\n"):
                文字列表.append(截取内容)
                # print(".", end="")
                return 文字列表

            宽, _ = 获取文字的宽高(字体=self.电子书字体, 字体大小=self.电子书字体大小, 文字=截取内容)

            if 宽 <= 最大宽度:
                指针结束 += 1
                continue

            if 跳跃步长 < 2:
                跳跃步长 = len(截取内容) - 2

            文字列表.append(截取内容)
            # print(".", end="")
            指针开始 = 指针结束

        return 文字列表

        # while 指针结束 < len(文字内容):
        #     if 指针结束 <= 指针开始:
        #         指针结束 += 跳跃步长
        #     字符 = 文字内容[指针开始:指针结束]
        #     宽, _ = 获取文字的宽高(字体=系统字体.楷体, 字体大小=16, 文字=当前行 + 字符)
        #
        #     if 当前宽度 + 宽 <= 最大宽度:
        #         当前行 += 字符
        #         当前宽度 += 宽
        #         指针 += 1
        #     else:
        #         if 当前行:
        #             文字列表.append(当前行)
        #         当前行 = ''
        #         当前宽度 = 0
        #         # 跳跃到接近最大宽度的位置
        #         指针 += 跳跃步长
        #
        # if 当前行:
        #     文字列表.append(当前行)
        #
        # return 文字列表


if __name__ == '__main__':
    # 作品文件路径：保存的 SVG（矢量图）格式的文件路径名称
    # 宽: 神笔绘图板也需要设置页面的宽度
    # 高: 神笔绘图板也需要设置页面的高度
    # 宽, 高 = 纸张大小.A4_纵向(10000)
    电子书 = 高清电子书制作(
        # 文本电子书=资源库目录("电子书/《三体》刘慈欣 (1~3全集) 三体.txt"),
        文本电子书=资源库目录("电子书/三体片段2.txt"),
        电子书字体大小=18, 电子书字体=系统字体.微软雅黑,
        背景色="#f5f1e8", 背景边框色="#ddd9d1", 文字颜色="#181716")
    电子书.完成()
    电子书.生成PDF()
